%% @author diana
%% @doc @todo Add description to test.


-module(maxteilsummeMatrixMitZugriff).

%% ====================================================================
%% API functions
%% ====================================================================
-export([maxSumme/1,sumMatrix/3]).



%% ====================================================================
%% Internal functions
%% ====================================================================

%% Die Methode liefert eine Liste aller Teilsummen mit entsprechenden Indizes in der Dreieck Matrix
%% Iteration durch i, tailrekursive Aufruf von "tailMatrix()"

maxSumme([H|T]) -> maxSumme([H|T], [], 0, 0, [0,{}], 0).
maxSumme([], Akk, _, _, MaxSumme, Zugr) -> {lists:flatten(MaxSumme), Zugr};
maxSumme([H|T],Akk, I, J, MaxSumme, Zugr) -> case hd(tl(hd(sumMatrix([H|T], I + 1, J)))) > hd(MaxSumme) of
									true -> maxSumme(T,Akk ++ hd(hd(sumMatrix([H|T], I + 1, J))), I + 1, J + 1, 
													  [hd(tl(hd(sumMatrix([H|T], I + 1, J))))],
													   Zugr + 4 + hd(tl(sumMatrix([H|T], I + 1, J))));
									false -> maxSumme(T,Akk ++ hd(sumMatrix([H|T], I + 1, J)), I + 1, J + 1, 
													  MaxSumme, Zugr + 5 + hd(tl(sumMatrix([H|T], I + 1, J)))) end.
	
	

%% Iteration durch j
sumMatrix([H|T], I, J) -> sumMatrix([H|T], 0, [], [0, {}], I, J, 0).
sumMatrix([], _, Akku2, MaxSumme, _, _, Zugr) -> [[[Akku2], MaxSumme], Zugr];
sumMatrix([H|T], Akku1, Akku2, MaxSumme, I, J, Zugr) -> case Akku1 + H > hd(MaxSumme) of
											true ->	sumMatrix(T, (Akku1 + H), Akku2 ++ [{Akku1 + H, {I, J + 1}}], 
														   [Akku1 + H, {I, J + 1}], I, J + 1, Zugr + 5);
											false -> sumMatrix(T, (Akku1 + H), Akku2 ++ [{Akku1 + H, {I, J + 1}}], 
														   MaxSumme, I, J + 1, Zugr + 3) end.	


